home *** CD-ROM | disk | FTP | other *** search
/ Compendium Deluxe 1 / LSD Compendium Deluxe 1.iso / a / programming / c / genmo112.lha / GTB-Modula / Modules / NewArgSupport.mod < prev   
Encoding:
Modula Implementation  |  1993-09-28  |  6.2 KB  |  293 lines

  1. IMPLEMENTATION MODULE NewArgSupport;
  2.  
  3. (*
  4.  * -------------------------------------------------------------------------
  5.  *
  6.  *    :Module.    NewArgSupport
  7.  *    :Contents.    Support module to get arguments transparent from CLI or Workbench
  8.  
  9.  *    :Author.    Reiner Nix
  10.  *    :Address.    Geranienhof 2, 5000 Köln 71 Seeberg
  11.  *    :Address.    rbnix@pool.informatik.rwth-aachen.de
  12.  *    :Copyright.    Public Domain
  13.  *    :Language.    Modula-2
  14.  *    :Translator.    M2Amiga A-L V4.2d
  15.  *    :History.    V1.0    08.08.92 ArgSupport
  16.  *    :History    V1.0    03.04.93 NewArgSupport now getting cli-args by ReadArg
  17.  *
  18.  * -------------------------------------------------------------------------
  19.  *)
  20.  
  21. FROM    SYSTEM            IMPORT    ADR;
  22. FROM    Arts            IMPORT    wbStarted,
  23.                     dosCmdBuf, dosCmdLen,
  24.                     programName,
  25.                     Assert, BreakPoint, Exit;
  26. FROM    Conversions        IMPORT    StrToVal;
  27. FROM    Arguments        IMPORT    NumArgs, GetArg;
  28. FROM    String            IMPORT    Length, Compare, ComparePart,
  29.                     ANSICapString,
  30.                     Copy, CopyPart,
  31.                     Concat, ConcatChar;
  32. FROM    DosD            IMPORT    maxTemplateItems,
  33.                     RDArgsPtr;
  34. FROM    DosL            IMPORT    ReadArgs, FreeArgs,
  35.                     AllocDosObject, FreeDosObject,
  36.                     FindArg,
  37.                     FPuts,
  38.                     Output;
  39. FROM    WorkbenchD        IMPORT    WBObjectType,
  40.                     DiskObjectPtr;
  41. FROM    IconL            IMPORT    GetDiskObject, FreeDiskObject,
  42.                     FindToolType, MatchToolValue;
  43. FROM    Memory            IMPORT    Allocate, Deallocate;
  44.  
  45.  
  46. CONST    CaseEqual        =FALSE;
  47.     maxTemplate        =1024;
  48.     dosRDArgs        =5;    (* fehlt noch in DosD.def *)
  49.  
  50.  
  51. VAR    Programmicon        :DiskObjectPtr;
  52.     ArgTemplate,
  53.     Arguments        :ARRAY [0..maxTemplate] OF CHAR;
  54.     ArgArray        :ARRAY [0..maxTemplateItems] OF LONGINT;
  55.     MyRDArguments,
  56.     RDArguments        :RDArgsPtr;
  57.  
  58.  
  59. (*
  60.  * --- private Funktionen -------------------------------------------------------
  61.  *)
  62.  
  63. PROCEDURE GetIcon;
  64.  
  65. VAR    Laenge            :INTEGER;
  66.     Iconname        :Str;
  67.  
  68.  
  69. BEGIN
  70. GetArg (0, Iconname, Laenge);
  71. Programmicon := GetDiskObject (ADR (Iconname))
  72. END GetIcon;
  73.  
  74.  
  75. (*
  76.  * --- öffentliche Funktionen ---------------------------------------------------
  77.  *)
  78.  
  79. PROCEDURE UseArguments        (    Template        :ARRAY OF CHAR);
  80.  
  81. VAR    dummy    :BOOLEAN;
  82.     i    :CARDINAL;
  83.  
  84. BEGIN
  85. IF NOT (wbStarted) THEN
  86.   Copy (ArgTemplate, Template);
  87.  
  88.   FOR i := 0 TO maxTemplateItems-1 DO
  89.     ArgArray[i] := 0
  90.     END;
  91.  
  92.  
  93.   MyRDArguments := AllocDosObject (dosRDArgs, NIL);
  94.   Assert (MyRDArguments # NIL, ADR ("Argumentstruktur nicht anzulegen."));
  95.  
  96.   Copy (Arguments, StrPtr (dosCmdBuf)^);
  97.  
  98.   WITH MyRDArguments^.source DO
  99.     buffer := ADR (Arguments);
  100.     length := Length (Arguments)
  101.     END;
  102.  
  103.  
  104.   RDArguments := ReadArgs (ADR (ArgTemplate), ADR (ArgArray), NIL (*MyRDArguments*));
  105.  
  106.   IF RDArguments = NIL THEN
  107.     IF Output () # NIL THEN
  108.       dummy := FPuts (Output (), programName);
  109.       dummy := FPuts (Output (), ADR (": "));
  110.       dummy := FPuts (Output (), ADR (ArgTemplate));
  111.       dummy := FPuts (Output (), ADR ("\nGefordertes Argument fehlt.\n"));
  112.       END;
  113.     Exit (10)
  114.     END
  115.  
  116.   END
  117. END UseArguments;
  118.  
  119.  
  120. PROCEDURE ArgString        (    Keyword,
  121.                      Default        :ARRAY OF CHAR;
  122.                  VAR Value        :ARRAY OF CHAR);
  123.  
  124. VAR    i        :LONGINT;
  125.     ToolType    :StrPtr;
  126.     Name        :Str;
  127.  
  128. BEGIN
  129. Copy (Name, Keyword);
  130. ANSICapString (Name);
  131.  
  132. IF wbStarted THEN
  133.   IF Programmicon = NIL THEN
  134.     Copy (Value, Default);
  135.     RETURN
  136.     END;
  137.  
  138.   ToolType := FindToolType (Programmicon^.toolTypes, ADR (Name));
  139.   IF ToolType = NIL THEN
  140.     Copy (Value, Default);
  141.     RETURN
  142.   ELSE
  143.     Copy (Value, ToolType^);
  144.     RETURN
  145.     END
  146.  
  147. ELSE (* NOT wbStarted *)
  148.   i := FindArg (ADR (ArgTemplate), ADR (Keyword));
  149.   Assert (i # -1, ADR ("ArgString: das Schlüsselwort fehlt in der Schablone."));
  150.  
  151.   IF StrPtr (ArgArray[i]) # NIL THEN
  152.     Copy (Value, StrPtr (ArgArray[i])^)
  153.   ELSE
  154.     Copy (Value, Default)
  155.     END;
  156.   RETURN
  157.   END
  158. END ArgString;
  159.  
  160.  
  161. PROCEDURE ArgInt        (    Keyword        :ARRAY OF CHAR;
  162.                      Default        :INTEGER) :INTEGER;
  163.  
  164.  
  165. TYPE    NumPtr        =POINTER TO LONGINT;
  166.  
  167. VAR    Negativ, Error    :BOOLEAN;
  168.     Number, i    :LONGINT;
  169.     Value        :Str;
  170.     ToolType    :StrPtr;
  171.  
  172. BEGIN
  173. ANSICapString (Keyword);
  174.  
  175. IF wbStarted THEN
  176.   IF Programmicon = NIL THEN
  177.     RETURN Default
  178.     END;
  179.  
  180.   ToolType := FindToolType (Programmicon^.toolTypes, ADR (Keyword));
  181.   IF ToolType = NIL THEN
  182.     RETURN Default
  183.   ELSE
  184.     Copy (Value, ToolType^)
  185.     END;
  186.   StrToVal (Value, Number, Negativ, 10, Error);
  187.   IF NOT (Error) & (MIN (INTEGER) <= Number) & (Number <= MAX (INTEGER)) THEN
  188.     RETURN Number
  189.   ELSE
  190.     RETURN Default
  191.     END
  192.  
  193. ELSE (* NOT wbStarted *)
  194.   i := FindArg (ADR (ArgTemplate), ADR (Keyword));
  195.   Assert (i # -1, ADR ("ArgInt: das Schlüsselwort fehlt in der Schablone."));
  196.  
  197.   IF (NumPtr (ArgArray[i]) # NIL) &
  198.      (MIN (INTEGER) <= NumPtr (ArgArray[i])^) & (NumPtr (ArgArray[i])^ <= MAX (INTEGER)) THEN
  199.     RETURN NumPtr (ArgArray[i])^
  200.   ELSE
  201.     RETURN Default
  202.     END
  203.   END
  204. END ArgInt;
  205.  
  206.  
  207. PROCEDURE ArgBoolean        (    Keyword        :ARRAY OF CHAR;
  208.                      Default        :BOOLEAN) :BOOLEAN;
  209.  
  210. VAR    i        :LONGINT;
  211.     Value        :Str;
  212.     ToolType    :StrPtr;
  213.  
  214. BEGIN
  215. ANSICapString (Keyword);
  216.  
  217. IF wbStarted THEN
  218.   IF Programmicon = NIL THEN
  219.     RETURN Default
  220.     END;
  221.  
  222.   ToolType := FindToolType (Programmicon^.toolTypes, ADR (Keyword));
  223.   IF ToolType = NIL THEN
  224.     RETURN Default
  225.     END;
  226.  
  227.   IF    MatchToolValue (ToolType, ADR ("yes")) OR
  228.         MatchToolValue (ToolType, ADR ("YES")) OR
  229.         MatchToolValue (ToolType, ADR ("Yes")) THEN
  230.     RETURN TRUE
  231.   ELSIF MatchToolValue (ToolType, ADR ("no")) OR
  232.         MatchToolValue (ToolType, ADR ("NO")) OR
  233.         MatchToolValue (ToolType, ADR ("No")) THEN
  234.     RETURN FALSE
  235.   ELSE
  236.     RETURN Default
  237.     END
  238.  
  239. ELSE (* NOT wbStarted *)
  240.   i := FindArg (ADR (ArgTemplate), ADR (Keyword));
  241.   Assert (i # -1, ADR ("ArgBoolean: das Schlüsselwort fehlt in der Schablone."));
  242.  
  243.   RETURN (ArgArray[i] # 0)
  244.   END
  245. END ArgBoolean;
  246.  
  247.  
  248. PROCEDURE ArgMultiple        (    Keyword        :ARRAY OF CHAR) :StrArrayPtr;
  249.  
  250.  
  251. VAR    i        :LONGINT;
  252.  
  253. BEGIN
  254. IF wbStarted THEN
  255.   RETURN NIL
  256.  
  257. ELSE
  258.   i := FindArg (ADR (ArgTemplate), ADR (Keyword));
  259.   Assert (i # -1, ADR ("ArgMultiple: das Schlüsselwort fehlt in der Schablone."));
  260.  
  261.   RETURN StrArrayPtr (ArgArray[i])
  262.   END
  263. END ArgMultiple;
  264.  
  265.  
  266. (* NewArgSupport *)
  267. BEGIN
  268. Programmicon := NIL;
  269. RDArguments := NIL;
  270. MyRDArguments := NIL;
  271.  
  272. IF wbStarted THEN
  273.   GetIcon
  274.   END;
  275.  
  276.  
  277. CLOSE
  278. IF Programmicon # NIL THEN
  279.   FreeDiskObject (Programmicon);
  280.   Programmicon := NIL
  281.   END;
  282.  
  283. IF RDArguments # NIL THEN
  284.   FreeArgs (RDArguments);
  285.   RDArguments := NIL;
  286.   END;
  287.  
  288. IF MyRDArguments # NIL THEN
  289.   FreeDosObject (dosRDArgs, MyRDArguments);
  290.   MyRDArguments := NIL
  291.   END
  292. END NewArgSupport.
  293.